package KuangShen.ZhuJieHeFanShe;
//测试类什么时候会初始化
/*
以下情况一定会发生类初始化（类被主动引用）：
1.当虚拟机启动，先初始化main方法所在的类
2.new一个类的对象
3.调用类的静态成员（除了final常量）和静态方法
4.使用java.lang.reflect包的方法对类进行反射调用
5.当初始化一个子类，如果父类没有被初始化，则会初始化其父类
 */
/*
以下情况不会发生类的初始化
1.当访问一个静态域时（静态变量和静态代码块），只有真正声明这个域的类采会被初始化
如：当子类引用父类的静态变量，不会导致子类初始化。
2.通过数组定义类引用，不会触发类的初始化
3.引用常量不会触发类的初始化
 */
public class test06 {
    static {
        System.out.println("main类被加载");
    }
    public static void main(String[] args) {
//        1.主动引用
        Son son= new Son();
//        2.反射产生的主动引用
        try {
            Class.forName("KuangShen.ZhuJieHeFanShe.Son");
        } catch (ClassNotFoundException e) {
           e.printStackTrace();
        }
//        3.子类调用父类静态域
      System.out.println(Son.b);
//       4.通过数组定义类引用，不会触发类的初始化
        Son [] array = new Son[5];
    }
}
class Father{
    static int b = 2;
    static {
        System.out.println("父类被加载");
    }
}
class Son extends Father{
    static {
        System.out.println("子类被加载");
        m=300;
    }
    static int m =100;
    static final int N =1;
}